import { getObjType,rgbTohex } from '../utils/util'
import { getSheetIndex } from '../methods/get'
import server from '../controllers/server'
import formula from './formula'
import editor from './editor'
import { dynamicArrayCompute } from './dynamicArray'
import sheetmanage from '../controllers/sheetmanage'
import { isInlineStringCT,isInlineStringCell,convertCssToStyleList } from '../controllers/inlineString'
import locale from '../locale/locale'
import Store from '../store'
import $ from 'jquery'

//Get selection range value
export function getdatabyselection(range, sheetIndex) {
    if(range == null){
        range = Store.luckysheet_select_save[0]
    }

    if (range['row'] == null || range['row'].length == 0) {
        return []
    }

    //取数据
    let d, cfg
    if(sheetIndex != null && sheetIndex != Store.currentSheetIndex){
        d = Store.luckysheetfile[getSheetIndex(sheetIndex)]['data']
        cfg = Store.luckysheetfile[getSheetIndex(sheetIndex)]['config']
    }
    else{
        d = editor.deepCopyFlowData(Store.flowdata)
        cfg = Store.config
    }

    let data = []

    for (let r = range['row'][0]; r <= range['row'][1]; r++) {
        if(d[r] == null){
            continue
        }

        if (cfg['rowhidden'] != null && cfg['rowhidden'][r] != null) {
            continue
        }

        let row = []

        for (let c = range['column'][0]; c <= range['column'][1]; c++) {
            row.push(d[r][c])
        }

        data.push(row)
    }

    return data
}

export function getdatabyselectionD(d, range) {
    if (range == null || range['row'] == null || range['row'].length == 0) {
        return []
    }

    let dynamicArray_compute = dynamicArrayCompute(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['dynamicArray'])
    let data = []

    if(d==null){
        return data
    }

    for (let r = range['row'][0]; r <= range['row'][1]; r++) {
        if(d[r] == null){
            continue
        }

        // if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
        //     continue;
        // }

        let row = []

        for (let c = range['column'][0]; c <= range['column'][1]; c++) {
            let value

            if((r + '_' + c) in dynamicArray_compute){
                value = dynamicArray_compute[r + '_' + c]
            }
            else{
                value = d[r][c]
            }

            row.push(value)
        }

        data.push(row)
    }

    return data
}

export function getdatabyselectionNoCopy(range) {
    if (range == null || range['row'] == null || range['row'].length == 0) {
        return []
    }

    let data = []

    for (let r = range['row'][0]; r <= range['row'][1]; r++) {
        let row = []

        if (Store.config['rowhidden'] != null && Store.config['rowhidden'][r] != null) {
            continue
        }

        for (let c = range['column'][0]; c <= range['column'][1]; c++) {
            let value = ''

            if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {
                value = Store.flowdata[r][c]
            }

            row.push(value)
        }

        data.push(row)
    }

    return data
}

//Get the value of the cell
export function getcellvalue(r, c, data, type) {
    if (type == null) {
        type = 'v'
    }

    if (data == null) {
        data = Store.flowdata
    }

    let d_value

    if (r != null && c != null) {
        d_value = data[r][c]
    }
    else if (r != null) {
        d_value = data[r]
    }
    else if (c != null) {
        let newData = data[0].map(function(col, i) {
            return data.map(function(row) {
                return row[i]
            })
        })
        d_value = newData[c]
    }
    else {
        return data
    }

    let retv = d_value

    if(getObjType(d_value) == 'object'){
        retv = d_value[type]

        if (type == 'f' && retv != null) {
            retv = formula.functionHTMLGenerate(retv)
        }
        else if(type == 'f') {
            retv = d_value['v']
        }
        else if(d_value && d_value.ct && d_value.ct.t == 'd') {
            retv = d_value.m
        }
    }

    if(retv == undefined){
        retv = null
    }

    return retv
}

//Data increase in rows and columns
export function datagridgrowth(data, addr, addc, iscallback) {
    if (addr <= 0 && addc <= 0) {
        return data
    }

    if (addr <= 0) {
        addr = 0
    }

    if (addc <= 0) {
        addc = 0
    }

    let dataClen = 0
    if (data.length == 0) {
        data = []
        dataClen = 0
    }
    else {
        dataClen = data[0].length
    }

    let coladd = []//需要额外增加的空列
    for (let c = 0; c < addc; c++) {
        coladd.push(null)
    }

    let rowadd = []//完整的一个空行
    for (let r = 0; r < dataClen + addc; r++) {
        rowadd.push(null)
    }

    for (let r = 0; r < data.length; r++) {
        data[r] = [].concat(data[r].concat(coladd))
    }

    for (let r = 0; r < addr; r++) {
        data.push([].concat(rowadd))
    }

    if(iscallback){
        server.saveParam('all', Store.currentSheetIndex, data.length, { 'k': 'row' })
        server.saveParam('all', Store.currentSheetIndex, data[0].length, { 'k': 'column' })
    }

    return data
}


//Get the formula of the cell
export function getcellFormula(r, c, i, data) {
    let cell
    if(data!=null){
        cell = data[r][c]
    }
    else{
        cell = getOrigincell(r,c,i)
    }


    if(cell==null){
        return null
    }

    return cell.f
}


export function getOrigincell(r, c, i) {
    if(r==null || c==null){
        return
    }
    let data
    if (i == null) {
        data = Store.flowdata
    }
    else{
        let sheet = sheetmanage.getSheetByIndex(i)
        data = sheet.data
    }

    if(!data || !data[r] || !data[r][c]){
        return
    }

    return data[r][c]


}

export function getRealCellValue(r, c){
    let value = getcellvalue(r, c, null, 'm')
    if(value == null){
        value = getcellvalue(r, c)
        if(value==null){
            let ct = getcellvalue(r, c, null, 'ct')
            if(isInlineStringCT(ct)){
                value = ct.s
            }
        }
    }

    return value
}

export function getInlineStringNoStyle(r, c){
    let ct = getcellvalue(r, c, null, 'ct')
    if(isInlineStringCT(ct)){
        let strings = ct.s, value=''
        for(let i=0;i<strings.length;i++){
            let strObj = strings[i]
            if(strObj.v!=null){
                value += strObj.v
            }
        }
        return value
    }

    return ''
}

export function getInlineStringStyle(r, c, data){
    let ct = getcellvalue(r, c, data, 'ct')
    if (data == null) {
        data = Store.flowdata
    }
    let cell = data[r][c]
    if(isInlineStringCT(ct)){
        let strings = ct.s, value=''
        for(let i=0;i<strings.length;i++){
            let strObj = strings[i]
            if(strObj.v!=null){
                let style = getFontStyleByCell(strObj)
                value += '<span index=\''+ i +'\' style=\''+ style +'\'>' + strObj.v + '</span>'
            }
        }
        return value
    }

    return ''
}

export function getFontStyleByCell(cell,checksAF,checksCF, isCheck=true){
    if(cell==null){
        return
    }
    let style = ''
    const _locale = locale()
    const locale_fontarray = _locale.fontarray
    for(let key in cell){
        let value = cell[key]
        if(isCheck){
            value = checkstatusByCell(cell, key)
        }
        if(key == 'bl' && value != '0'){
            style += 'font-weight: bold;'
        }

        if(key == 'it' && value != '0'){
            style += 'font-style:italic;'
        }

        if(key == 'ff'){
            let f = value
            if(!isNaN(parseInt(value))){
                f = locale_fontarray[parseInt(value)]
            }
            else{
                f = value
            }
            style += 'font-family: ' + f + ';'
        }

        if(key == 'fs'){
            style += 'font-size: '+ value + 'pt;'
        }

        if((key == 'fc' && value != '#000000') || checksAF != null || (checksCF != null && checksCF['textColor'] != null)){
            if(checksCF != null && checksCF['textColor'] != null){
                style += 'color: ' + checksCF['textColor'] + ';'
            }
            else if(checksAF != null){
                style += 'color: ' + checksAF[0] + ';'
            }
            else{
                style += 'color: ' + value + ';'
            }
        }

        if(key == 'cl' && value != '0'){
            style += 'text-decoration: line-through;'
        }

    }
    return style
}

export function checkstatusByCell(cell, a){
    let foucsStatus =cell
    let tf = {'bl':1, 'it':1 , 'ff':1, 'cl':1, 'un':1}

    if(a in tf || (a=='fs' && isInlineStringCell(cell)) ){
        if(foucsStatus == null){
            foucsStatus = '0'
        }
        else{
            // var  w = window.getSelection(), isInlineEdit=false;
            // if(w.type!="None"){
            //     var range = w.getRangeAt(0);
            //     let startContainer = range.startContainer;
            //     if (parseInt($("#luckysheet-input-box").css("top")) > 0 && startContainer.parentNode.tagName=="SPAN" && !range.collapsed) {
            //         let span = startContainer.parentNode;
            //         let styleList = convertCssToStyleList(span.style.cssText);
            //         foucsStatus = styleList[a];
            //         isInlineEdit = true;
            //     }
            // }

            // if(!isInlineEdit){
            //     if(isInlineStringCell(cell)){
            //         foucsStatus = cell.ct.s[0][a];
            //     }
            //     else{
            //         foucsStatus = foucsStatus[a];
            //     }
            // }

            foucsStatus = foucsStatus[a]

            if(foucsStatus == null){
                foucsStatus = '0'
            }
        }
    }
    else if(a == 'fc'){
        if(foucsStatus == null){
            foucsStatus = '#000000'
        }
        else{
            foucsStatus = foucsStatus[a]

            if(foucsStatus == null){
                foucsStatus = '#000000'
            }

            if(foucsStatus.indexOf('rgba') > -1){
                foucsStatus = rgbTohex(foucsStatus)
            }
        }
    }
    else if(a == 'bg'){
        if(foucsStatus == null){
            foucsStatus = null
        }
        else{
            foucsStatus = foucsStatus[a]

            if(foucsStatus == null){
                foucsStatus = null
            }
            else if(foucsStatus.toString().indexOf('rgba') > -1){
                foucsStatus = rgbTohex(foucsStatus)
            }
        }
    }
    else if(a.substr(0, 2) == 'bs'){
        if(foucsStatus == null){
            foucsStatus = 'none'
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = 'none'
            }
        }
    }
    else if(a.substr(0, 2) == 'bc'){
        if(foucsStatus == null){
            foucsStatus = '#000000'
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = '#000000'
            }
        }
    }
    else if(a == 'ht'){
        if(foucsStatus == null){
            foucsStatus = '1'
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = '1'
            }
        }

        if(['0', '1', '2'].indexOf(foucsStatus.toString()) == -1){
            foucsStatus = '1'
        }
    }
    else if(a == 'vt'){//默认垂直居中
        if(foucsStatus == null){
            foucsStatus = '0'
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = '0'
            }
        }

        if(['0', '1', '2'].indexOf(foucsStatus.toString()) == -1){
            foucsStatus = '0'
        }
    }
    else if(a == 'ct'){
        if(foucsStatus == null){
            foucsStatus = null
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = null
            }
        }
    }
    else if(a == 'fs'){
        if(foucsStatus == null){
            foucsStatus = String(Store.defaultFontSize)
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = String(Store.defaultFontSize)
            }
        }
    }
    else if(a == 'tb'){
        if(foucsStatus == null){
            foucsStatus = '0'
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = '0'
            }
        }
    }
    else if(a == 'tr'){
        if(foucsStatus == null){
            foucsStatus = '0'
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = '0'
            }
        }
    }
    else if(a == 'rt'){
        if(foucsStatus == null){
            foucsStatus = null
        }
        else{
            foucsStatus = foucsStatus[a]
            if(foucsStatus == null){
                foucsStatus = null
            }
        }
    }

    return foucsStatus
}

export function textTrim(x) {
    if(x==null || x.length==0){
        return x
    }
    return x.replace(/^\s+|\s+$/gm,'')
}